package com.erp.erp_dao.business;

import com.erp.erp_entitys.business.entity.CarryDetailEntity;
import com.erp.erp_entitys.business.entity.CarryDetailProductEntity;
import com.erp.erp_entitys.business.req.*;
import com.erp.erp_entitys.business.rsp.*;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;

/**
 * 仓库管理-出运明细表(CarryDetail)表数据库访问层
 *
 * @author lst
 * @since 2021-01-07 20:05:31
 */
public interface ICarryDetailDao {

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    CarryDetailEntity queryById(Integer id);



    /**
     * 通过实体作为筛选条件查询
     *
     * @param carryDetail 实例对象
     * @return 对象列表
     */
    List<CarryDetailEntity> queryAll(CarryDetailEntity carryDetail);

    /**
     * 新增数据
     *
     * @param carryDetail 实例对象
     * @return 影响行数
     */
    int insert(CarryDetailEntity carryDetail);

    /**
     * 修改数据
     *
     * @param carryDetail 实例对象
     * @return 影响行数
     */
    int update(CarryDetailEntity carryDetail);


    /**
     * 获取出运明细信息
     * @param req 查询条件
     * @return 出运明细信息
     */
    List<ImportCarryDetailRsp> getCarryDetailInfo(ImportCarryDetailInfoReq req);


    /**
     * 出运明细分页查询
     * @param req 查询条件
     * @return 出运明细分页
     */
    List<CarryDetailEntity> getCarryDetailPageList(CarryDetailPageListInfoReq req);


    /**
     * 获取出运计划信息
     * @param req 查询条件
     * @return 出运计划信息
     */
    List<ImportCarryPlanInfoRsp> getShipmentPlanInfo(ImportCarryPlanInfoReq req);

    /**
     * 通过父id获取出运计划产品明细信息
     * @param id 出运计划主表id
     * @return 产品明细信息
     */
    List<ImportCarryPlanProductInfoRsp> getCarryPlanProductByParentId(Integer id);


    /**
     * 通过id获取出运计划信息
     * @param id 出运计划ID
     * @return 运计划信息
     */
    CarryPlanInfoRsp getCarryPlanById(Integer id);


    /**
     * 导出运计划费用信息
     * @param id 出运计划id
     * @return 出运计划费用信息
     */
    List<ImportPlanCostInfoRsp> getCarryPlanCostInfo(Integer id);


    /**
     * 导出运计划附件信息
     * @param id 出运计划id
     * @return 出运计划附件信息
     */
    List<ImportCarryPlanAnnexRsp> getCarryPlanAnnexInfo(Integer id);


    /**
     * 导出运计划配件信息
     * @param id 出运计划id
     * @param productId 对应产品id
     * @return 出运计划配件信息
     */
    List<ImportCarryPlanPartsRsp> getCarryPlanPartsInfo(@Param("id") Integer id, @Param("productId") Integer productId);

    /**
     * 销售出库获取出运明细主表关联库存信息
     * @param req 查询参数
     * @return 出运明细主表关联库存信息
     */
    List<CarryDetailEntity> getImportCarryOfSaleOutStock(ImportCarryDetailInfoReq req);

    /**
     * 导出运计划主表关联调拨信息
     * @param req 查询参数
     * @return 出运计划主表关联调拨信息
     */
    List<ImportCarryPlanInfoRsp> importCarryPlanAssociateTransfer(ImportCarryPlanInfoReq req);

    /**
     * 导出运计划子表关联调拨信息
     * @param id 出运计划主表id
     * @return 产品明细信息
     */
    List<ImportCarryPlanProductInfoRsp> importCarryPlanProductAssociateTransfer(Integer id);


    /**
     * 通过id获取出运计划信息
     * @param id 出运计划ID
     * @return 运计划信息
     */
    CarryPlanInfoRsp queryCarryPlanInfoById(Integer id);

    /**
     * 本月出运单据
     * @param req 查询条件
     * @return 总和
     */
    long getCarryBillNoCount(StatisticsInfoReq req);

    /**
     * 本月出运单据信息
     * @param req 查询条件
     * @return 本月出运单据信息
     */
    List<CarryDetailEntity> getCarryInfo(StatisticsInfoReq req);

    /**
     * 统计采购出货情况
     * @param req 查询参数
     * @return 采购出货情况
     */
    List<StatisticsPurchaseInfoRsp> getStatisticsPurchaseInfo(PurchaseStatisticsOneReq req);
    /**
     * 采购排产及计划统计
     * @param req 查询参数
     * @return 采购出货情况
     */
    List<PurchaseStatisticsTwoRes> getStatisticsTwoPurchaseInfo(PurchaseStatisticsTwoReq req);

    /**
     * 按出运明细统计采购应付款信息
     * @param req 查询参数
     * @return 按出运明细统计采购应付款信息
     */
    List<StatisticsCarryDetailPaymentRsp> getStatisticsCarryDetailPaymentInfo(CarryDetailStatisticsPaymentReq req);
    /**
     * 供应商出货详情统计
     * @param req
     * @return
     */
    List<StatisticShippingDetailRsp> getShippingDetailByPage(statisticShippingDetailReq req);
    /**
     * 获取已做出运明细数量
     * @param req 查询参数
     * @return 已做出运明细数量
     */
    BigDecimal getUsedCarryDetailNum(CarryDetailInfoReq req);

    /**
     * 已做明细未结汇--集合
     * @param req
     * @return
     */
    List<DetailUnBillExchangeRsq> detailUnBillExchangeList(DetailUnBillExchangeReq req);
    /**
     * 已出运未结汇（物流）--集合
     * @param req
     * @return
     */
    List<DetailShippedUnExchangeRsp> detailShippedUnExchangeList(DetailShippedUnExchangeReq req);
    /**
     * 获取已被使用的产品数量
     * @param req 查询参数
     * @return 已被使用的产品数量
     */
    BigDecimal getUsedProductSum(CarryDetailProductEntity req);

    /**
     * 获取已被使用的产品数量（采购）
     * @param productCode 产品编码
     * @param specNo 规格编码
     * @return 已被使用的产品数量（采购）
     */
    BigDecimal getUsedProductSumInPurchase(@Param("productCode")String productCode, @Param("specNo") String specNo);

    /**
     * 出运是否结汇统计
     * @param req 查询参数
     * @return 出运是否结汇统计
     */
    List<ShipmentIsBillExchangeRsp> getShipmentIsBillExchange(ShipmentIsBillExchangeReq req);

    /**
     * 根据 外销合同号 产品编码 查询该产品的剩余数量
     * @param shipmentNo 出运计划编码
     * @param carryDetailProductId 出运明细产品的id
     * @param exportCode 外销合同号
     * @param productCode 产品编码
     * @param specNo 规格编码
     * @return 剩余数量
     */
    Integer surplusAmount(@Param("shipmentNo")String shipmentNo,
                          @Param("carryDetailProductId")Integer carryDetailProductId,
                          @Param("exportCode")String exportCode,
                          @Param("productCode")String productCode,
                          @Param("specNo")String specNo);

}